package com.sob.bountyhunter.condiciones;

import com.sob.bountyhunter.entidades.Entidad;
import com.sob.bountyhunter.entidades.actores.Actor;
import com.sob.bountyhunter.entidades.actores.Jugador;
import com.sob.bountyhunter.entidades.actores.Mob;

/**
 * Condicion que contagia las condiciones del afectado a otras entidades cercanas 
 * @author MagusDemon
 *
 */
public class CondicionContagio extends Condicion {
	public static final long DEFAULT_DURACION = 5000;
	public static final long DEFAULT_INTERVALO = 1000;
	public static final int DEFAULT_DISTANCIA = 50;
	public static final String DEFAULT_NOMBRE = "Contagioso";	//Nombre
	
	private int distancia;
	
	public CondicionContagio(Actor h) {
		super(DEFAULT_NOMBRE,h, DEFAULT_DURACION, DEFAULT_INTERVALO);
		distancia=DEFAULT_DISTANCIA;
	}

	public CondicionContagio(Actor h, int dist) {
		super(DEFAULT_NOMBRE,h, DEFAULT_DURACION, DEFAULT_INTERVALO);
		distancia=dist;
	}
	
	public CondicionContagio(Actor h, int dist, long tiempo) {
		super(DEFAULT_NOMBRE,h, tiempo, DEFAULT_INTERVALO);
		distancia=dist;
	}
	
	public CondicionContagio(Actor h, int dist, long tiempo, long intervalo) {
		super(DEFAULT_NOMBRE,h, tiempo, intervalo);
		distancia=dist;
	}
	
	

	@Override
	protected void setPotencia(){
		potencia=(int)(duracion.getDuration()/duracion.getIntervalo());
		potencia+=distancia;
	}

	public void updateCondicion(){
		super.updateCondicion();
		
		//Si hay que aplicar
		if(duracion.isTick()){
			//Busca entidades
			for(Entidad e: afectado.map.entidades){
				if(e instanceof Actor){
					Actor a=(Actor)e;
					//Que no sean el propio afectado
					if(!e.equals(afectado)){		
						//Que sean aplicables
						if(e instanceof Jugador || e instanceof Mob){
							//Y que esten a la distancia adecuada
							if(e.getDist(afectado)<=distancia){
								infecta(a);
							}
						}
					}
				}
			}
		}
				
		if(duracion.isFinished()){
			delete=true;
		}
	}
	
	/**
	 * Copia las condiciones a otra entidad
	 * @param e Entidad a recivir las condiciones
	 */
	private void infecta(Actor e){
		for(Condicion c: afectado.hojaPersonaje.getCondiciones()){
			Condicion cCopia=c.copy(e);
			e.hojaPersonaje.addCondicion(cCopia);
		}		
	}
	
	public int getDistancia(){
		return distancia;
	}
}
